今天要實作的是一種常見的互動效果,「點擊並拖曳」。大家可以在下面實作範例中操作,按住滑鼠左鍵,將這串數字列表左右移動。
這次實作的code如下所示,mousedown事件抓取點擊時的X值(e.pageX)及當下的滾輪位置(slider.scrollLeft)。而e.pageX減掉slider.offsetLeft是為了修正div如果有margin造成的偏差。
而mouseleave和mouseup都只是將class移除。
mousemove事件是持續抓取滑鼠位置,並和點擊時的位置做相減,得到位移距離,再將點擊時的滾輪位置減去這段位移,重新指定給滾輪位置,即可完成拖曳功能。
const slider = document.querySelector('.items');
let isDown = false;
let startX;
let scrollLeft;
slider.addEventListener('mousedown', (e) => {
isDown = true;
slider.classList.add('active');
startX = e.pageX - slider.offsetLeft;
scrollLeft = slider.scrollLeft;
});
slider.addEventListener('mouseleave', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mouseup', () => {
isDown = false;
slider.classList.remove('active');
});
slider.addEventListener('mousemove', (e) => {
if (!isDown) return; // stop the fn from running
e.preventDefault();
const x = e.pageX - slider.offsetLeft;
const walk = (x - startX) * 3;
slider.scrollLeft = scrollLeft - walk;
});